package com.simon.cdc.event;


import com.simon.cdc.database.DatabaseConnectionPool;
import com.simon.cdc.sql.SQLQueryBuilder;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

/**
 * CDC事件处理执行器
 */
//@Slf4j
public final class ChangeEventProcessor {

    /**
     * 处理变更事件并更新数据库
     * 本方法根据变更事件构建SQL语句，并通过数据库连接池执行这些SQL语句
     * 主要涉及从事件中提取信息，构建SQL，获取数据库连接，执行SQL，最后关闭连接
     *
     * @param event 变更事件，包含构建SQL所需的信息
     * @param pool  数据库连接池，用于获取数据库连接
     * @throws SQLException 如果数据库操作失败，抛出此异常
     */
    public void process(ChangeEvent event, DatabaseConnectionPool pool)  {
        // 根据变更事件构建SQL语句
        String sql = SQLQueryBuilder.build(event);
        // 输出SQL语句，用于调试和日志记录
        // log.debug(sql);
        System.out.println(sql);
        // 使用try-with-resources确保数据库连接和PreparedStatement能够被正确关闭
        try (Connection conn = pool.getConnection();
             PreparedStatement stmt = conn.prepareStatement(sql)) {
            // 执行SQL更新操作
            stmt.executeUpdate();
        } catch (SQLException e) {
            // 由于方法签名已经声明了SQLException，因此这里不需要显式捕获和处理异常
            // 记录保存异常sql 遇到错误队列有错误数据时候发出预警，避免数据丢失  如果超过70%则停止任务
            throw new RuntimeException(e);
        }

    }

}